package com.ruoyi.quartz.task;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.config.MinioConfig;
import com.ruoyi.app.home.entity.MinioFile;
import com.ruoyi.app.home.mapper.MinioFileMapper;
import io.minio.ListObjectsArgs;
import io.minio.MinioClient;
import io.minio.Result;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.http.Method;
import io.minio.messages.Item;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * MinIO文件同步任务
 * 
 * @author ruoyi
 * @date 2025-09-26
 */
@Slf4j
@Component("minioFileSyncTask")
public class MinioFileSyncTask {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfig minioConfig;

    @Autowired
    private MinioFileMapper minioFileMapper;

    /**
     * 同步MinIO文件信息到数据库
     */
    public void syncMinioFiles() {
        try {
            log.info("开始同步MinIO文件信息到数据库");
            // 清空现有数据（使用QueryWrapper避免全表删除限制）
            minioFileMapper.delete(new QueryWrapper<MinioFile>().eq("1", 1));
            
            // 获取桶中所有文件
            List<MinioFile> fileList = new ArrayList<>();
            Iterable<Result<Item>> results = minioClient.listObjects(
                    ListObjectsArgs.builder()
                            .bucket(minioConfig.getBabyBucketName())
                            .recursive(true)
                            .build());

            for (Result<Item> result : results) {
                Item item = result.get();
                MinioFile minioFile = new MinioFile();
                
                // 文件名
                minioFile.setFileName(item.objectName().substring(item.objectName().lastIndexOf("/") + 1));
                
                // 文件路径
                minioFile.setFilePath(item.objectName());
                
                // 上级目录
                int lastSlashIndex = item.objectName().lastIndexOf("/");
                if (lastSlashIndex > 0) {
                    minioFile.setParentDirectory(item.objectName().substring(0, lastSlashIndex));
                } else {
                    minioFile.setParentDirectory("/");
                }
                
                // 文件大小
                minioFile.setFileSize(item.size());
                
                // 文件后缀
                String fileName = item.objectName();
                if (fileName.contains(".")) {
                    minioFile.setFileSuffix(fileName.substring(fileName.lastIndexOf(".") + 1));
                } else {
                    minioFile.setFileSuffix("");
                }
                
                // 文件类型（根据后缀判断）
                minioFile.setType(getFileType(minioFile.getFileSuffix()));
                
                // 预览地址和下载地址
                try {
                    String previewUrl = minioClient.getPresignedObjectUrl(
                        GetPresignedObjectUrlArgs.builder()
                            .method(Method.GET)
                            .bucket(minioConfig.getBabyBucketName())
                            .object(item.objectName())
                            .build());
                    minioFile.setPreviewUrl(previewUrl);
                    minioFile.setDownloadUrl(previewUrl);
                } catch (Exception e) {
                    log.error("获取文件预览/下载地址失败: " + item.objectName(), e);
                    // 使用默认地址
                    String defaultUrl = minioConfig.getEndpoint() + "/" + minioConfig.getBabyBucketName() + "/" + item.objectName();
                    minioFile.setPreviewUrl(defaultUrl);
                    minioFile.setDownloadUrl(defaultUrl);
                }

                minioFile.setCreateTime(new Date());
                minioFileMapper.insert(minioFile);
                fileList.add(minioFile);

            }
            log.info("成功同步 {} 个MinIO文件信息到数据库", fileList.size());
        } catch (Exception e) {
            log.error("同步MinIO文件信息到数据库失败", e);
        }
    }
    
    /**
     * 根据文件后缀获取文件类型
     * 
     * @param suffix 文件后缀
     * @return 文件类型
     */
    private String getFileType(String suffix) {
        if (!StringUtils.hasText(suffix)) {
            return "未知";
        }
        
        suffix = suffix.toLowerCase();
        
        // 图片类型
        if ("jpg".equals(suffix) || "jpeg".equals(suffix) || "png".equals(suffix) 
                || "gif".equals(suffix) || "bmp".equals(suffix) || "webp".equals(suffix)) {
            return "图片";
        }
        
        // 文档类型
        if ("doc".equals(suffix) || "docx".equals(suffix) || "txt".equals(suffix) 
                || "pdf".equals(suffix) || "ppt".equals(suffix) || "pptx".equals(suffix)
                || "xls".equals(suffix) || "xlsx".equals(suffix)) {
            return "文档";
        }
        
        // 视频类型
        if ("mp4".equals(suffix) || "avi".equals(suffix) || "mov".equals(suffix) 
                || "wmv".equals(suffix) || "flv".equals(suffix) || "mkv".equals(suffix)) {
            return "视频";
        }
        
        // 音频类型
        if ("mp3".equals(suffix) || "wav".equals(suffix) || "flac".equals(suffix) 
                || "aac".equals(suffix) || "ogg".equals(suffix)) {
            return "音频";
        }
        
        // 压缩包类型
        if ("zip".equals(suffix) || "rar".equals(suffix) || "7z".equals(suffix) 
                || "tar".equals(suffix) || "gz".equals(suffix)) {
            return "压缩包";
        }
        
        return "其他";
    }
}